/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algoGenetico;

import Rota.Mapa;
import Selecao.AUEstocastica;
import Selecao.Roleta;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Administrador
 */
public class Populacao {

    private List<Individuo> individuo = new ArrayList<Individuo>();
    private Individuo indBestFit;
    private double bestFit = 0;
    private Mapa mapa;

    public Populacao(Mapa mapa) {
        this.mapa = mapa;
    }

    public List<Individuo> getIndividuo() {
        return individuo;
    }

    public void gerarPopulacaoInicial(int tamanho, int origem, int destino) {
        System.out.println("origem = " + origem + "| destino =  " + destino);
        List<Individuo> populacaoInicial = new ArrayList<Individuo>();
        for (int i = 0; i < tamanho; i++) {
            int[] auxGenes = new int[mapa.mapa.size()];
            auxGenes[0] = origem;
            int w = 0;
            int random = 0;
            do {
                w++;
                boolean ok = false;
                while (!ok) {
                    ok = true;
                    double auxmat = Math.random();
                    double auxSize = (double) mapa.getMapa().size();
                    double aux = auxmat * auxSize; //se o mapa tem size x, serao sorteados
                    random = (int) aux;//valores entre 0 e x-1
                    if (auxGenes.length != 0) {
                        for (int q = 0; q < auxGenes.length; q++) {
                            if (auxGenes[q] == random) {
                                ok = false;
                                break;
                            }
                        }
                        auxGenes[w] = random;
                    } else {
                        ok = false;
                    }
                }
            } while (random != destino);
            ArrayList<Integer> genes = new ArrayList<Integer>();
            for (int z = 0; z < w + 1; z++) {
                genes.add(auxGenes[z]);
            }
            Cromossomo x = new Cromossomo(genes);
            populacaoInicial.add(new Individuo(x));
        }
        individuo = populacaoInicial;
//        atualizaFitness();
//        imprime();
//        new Roleta().selecao(individuo, 20);
//        new AUEstocastica().selecao(individuo, 20);
    }

    public double getFitnessPopulacao(){
        double Total = 0;
        for (Individuo obj : individuo) {
           Total += obj.getFitness();
           }        
        return Total;
    }

    public double atualizaFitness() {
        double fitTotal = 0;
        double maiorFit = 0;
        for (Individuo obj : individuo) {
           double fitAtual = obj.calcularFitness(mapa);
           fitTotal += fitAtual;
           if(fitAtual>= maiorFit){
               maiorFit = fitAtual;
               this.bestFit = maiorFit;
               this.indBestFit = new Individuo(obj.getCromossomo());
           }
        }
        return fitTotal;
    }


    public void imprime() {
        int x = 0;
        for (Individuo obj : individuo) {
            Cromossomo a = obj.getCromossomo();
            System.out.println("individuo " + x + ":");
            for (int i = 0; i < a.getGenes().size(); i++) {
                System.out.print(a.getGenes().get(i) + "|");
            }
            System.out.print(" " + obj.getFitness());
            System.out.println("");
            x++;
        }
    }
}
